package cn.edu.pzhu.javaweb.pojo;

import java.io.Serializable;

/**
 * 统一响应结果类，用于业务层与前端的数据交互
 * 包含状态码、消息提示和业务数据三部分
 */
public class Result<T> implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    // 状态码：0-成功，非0-失败（可根据业务定义具体错误码）
    private Integer code;

    // 消息提示：成功/失败的具体描述
    private String message;

    // 业务数据：成功时返回的数据（如查询结果、新增的ID等）
    private T data;

    // 私有化构造方法，通过静态方法创建实例
    private Result() {}

    private Result(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    // -------------------- 成功响应 --------------------

    /**
     * 成功响应（无数据）
     */
    public static <T> Result<T> success() {
        return new Result<>(0, "操作成功", null);
    }

    /**
     * 成功响应（带数据）
     * @param data 业务数据（如查询的列表、对象等）
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(0, "操作成功", data);
    }

    /**
     * 成功响应（自定义消息+数据）
     * @param message 自定义成功消息
     * @param data 业务数据
     */
    public static <T> Result<T> success(String message, T data) {
        return new Result<>(0, message, data);
    }

    // -------------------- 失败响应 --------------------

    /**
     * 失败响应（默认消息）
     */
    public static <T> Result<T> fail() {
        return new Result<>(1, "操作失败", null);
    }

    /**
     * 失败响应（自定义错误消息）
     * @param message 错误描述
     */
    public static <T> Result<T> fail(String message) {
        return new Result<>(1, message, null);
    }

    /**
     * 失败响应（自定义错误码+消息）
     * @param code 错误码（非0）
     * @param message 错误描述
     */
    public static <T> Result<T> fail(Integer code, String message) {
        if (code == 0) {
            throw new IllegalArgumentException("错误码不能为0（0表示成功）");
        }
        return new Result<>(code, message, null);
    }

    /**
     * 失败响应（带错误数据，如参数校验失败的字段详情）
     * @param code 错误码
     * @param message 错误描述
     * @param data 错误相关数据（如校验失败的字段列表）
     */
    public static <T> Result<T> fail(Integer code, String message, T data) {
        if (code == 0) {
            throw new IllegalArgumentException("错误码不能为0（0表示成功）");
        }
        return new Result<>(code, message, data);
    }

    // -------------------- getter/setter --------------------

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}